#!/bin/bash

#
# Nombre:      gralog.sh
# Autor:       Pablo Martin Viva <pmviva@gmail.com>
# Fecha:       19/04/2011
# Descripcion: Provee la funcionalidad de escribir mensajes de log a un
#              determinado archivo de log, con 5 variedades de niveles
#              de log, truncando el archivo a la mitad de su tamanio si
#              este excede el tamanio maximo permitido de logs definido
#              por la variable de entorno $LOGSIZE.
#

#
# Modo de uso:
#
# ./gralog.sh <<COMANDO>> <<MENSAJE>> [<<NIVEL>>]
#
# Donde <<COMANDO>> es el nombre del comando que invoca al script gralog.sh
#
# Donde <<MENSAJE>> es el mensaje a loguear mediante el script gralog.sh
#
# Donde <<NIVEL>> es opcional y representa el nivel de log que puede ser:
# D = DEBIG
# I = INFORMATIVE
# W = WARNING
# E = ERROR
# F = FATAL
#


#
# Verifico que recibo al menos 2 parametros obligatorios:
# 1) COMANDO
# 2) MENSAJE
#
if [ $# -lt 2 ]
then
	echo 'Error#1: Cantidad invalida de parametros'
	exit 1
fi

#
# Obtengo parametro comando
#
comando=$1

#
# Obtengo parametro mensaje
#
mensaje=$2

#
# Verifico que recibo el parametro 3:
# 3) NIVEL
#
if [ $# -ge 3 ]
then
	#
	# Obtengo parametro nivel
	#
	nivel=$3
else
	#
	# Obtengo parametro nivel default ==> DEBUG
	#
	nivel="D"
fi

#
# Valido parametro nivel
#
case "$nivel" in
"D")
	nivel="DEBUG"
;;
"I")
	nivel="INFORMATIVE"
;;
"W")
	nivel="WARNING"
;;
"E")
	nivel="ERROR"
;;
"F")
	nivel="FATAL"
;;
*)
	echo "Error#2: Codigo de nivel invalido"
	exit 2
;;
esac

#
# Verifico que variable LOGDIR este establecida
#
if [ -z $LOGDIR ]
then
	echo "Error#3: Variable LOGDIR no esta establecida"
	exit 3
fi

#
# Verifico que variable LOGEXT este establecida
#
if [ -z $LOGEXT ]
then
	echo "Error#4: Variable LOGEXT no esta establecida"
	exit 4
fi

#
# Verifico que variable LOGSIZE esta establecida
#
if [ -z $LOGSIZE ]
then
	echo "Error#5: Variable LOGSIZE no esta establecida"
	exit 5
fi

#
# Obtengo fecha y hora actual del sistema
#
fechaHora=`date '+%Y/%m/%d %H:%M:%S'`

#
# Obtengo usuario logueado en el sistema
#
usuarioLogueado=`whoami`

#
# Obtengo registro de log
#
registro="$usuarioLogueado-$fechaHora-$comando-$nivel-$mensaje"

#
#
#
archivoLog="$LOGDIR/$comando.$LOGEXT"

#
# Verifico que el archivo de log exista
#
if [ -f $archivoLog ]
then
	#
	# Obtengo el tamanio del archivo de log en bytes
	#
	tamanioArchivoLog=`stat --format='%s' $archivoLog`

	#
	# Valido el tamanio del archivo de log en bytes
	#
	if [ $LOGSIZE -le $tamanioArchivoLog ]
	then
		#
		# Calculo cantidad de lineas en archivo de log
		#
		cantidadLineasArchivoLog=`sed -n -e '$=' $archivoLog`
		#
		# Obtengo estimado de cantidad de lineas a borrar
		#
		cantidadLineasBorrarArchivoLog=`echo "scale=0;$cantidadLineasArchivoLog/2" | bc`
		#
		# Defino archivo de log temporal
		#
		archivoLogTemporal="$archivoLog.tmp"
		
		#
		# Escribo mensaje de log excedido
		# 
		echo "Log excedido..." > $archivoLogTemporal

		#
		# Trunco archivo de log
		#
		sed -n -e "$cantidadLineasBorrarArchivoLog"',$p' $archivoLog >> $archivoLogTemporal
		mv $archivoLogTemporal $archivoLog
	fi
fi

#
# Escribo registro de log en archivo de log
#
echo $registro >> $archivoLog
